package util.form.respuesta;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;

import util.patron.command.Command1;
import util.www.sql.InsertUpdateSql;

public class RegistroImpl 
implements Registro
{
	private final Map<String,ValorObject> valoresMap = new HashMap<String,ValorObject>();
	protected final List<ValorObject> valores = new ArrayList<ValorObject>();
	//protected final List<Valor> valoresClave = new ArrayList<Valor>();
	
	//private final String nombre;
	    
	/*
    public RegistroImpl(String nombre) {
        this.nombre = nombre;
    }*/
	
	public boolean isVacio() {
		return valores.isEmpty();
	}
	
	public void agregar(String columna, String valor) {               
	    agregarValor(columna,valor,String.class,false);
	}
	
	/*
	public void agregarClave(String columna, String valor) {               
		agregarValor(columna,valor,String.class,true);
	}*/
	 
	private void agregarValor(String columna, Object valor, Class<?> claseValor, boolean esClave) {
		
		if(columna!=null) {
		    String key = columna.toUpperCase(Locale.getDefault());
		    ValorObject v = valoresMap.get(key);
		    
		    if(v==null) {//es nuevo
		    	v = new ValorObject();
			    v.setColumna(columna);
			    v.setObjeto(valor);
			    v.setClaseValor(claseValor);
			    valores.add(v);
			    valoresMap.put(key,v);
			    //if(esClave)
			    //	valoresClave.add(v);
		    }
		    else {//ya fue ingresado, entonces reemplaza el valor
		    	//actualizando el valor
		    	v.setClaseValor(claseValor);
		    	v.setObjeto(valor);
		    }
		}
	}
	
	@Override
	public ValorObject getValor(String columna) {
		if(columna!=null)
			return valoresMap.get(columna.toUpperCase(Locale.getDefault()));
		return null;
	}
	
	public String getValorString(String columna) {
		ValorObject v = getValor(columna);
		return v!=null? v.toString() : null;
	}
	
	/*
	@Override
	public String getNombre() {
		return nombre;
	}*/

	@Override
	public void agregarValoresSQL(InsertUpdateSql iuSql) throws SQLException {
		for(ValorObject v: valores) {
			iuSql.agregar(v.getColumna(),v.toString());
		}
	}

	
	/*
	public String[] getColumnasClave() {
		if(valoresClave.isEmpty())
			return null;
		
		String[] arreglo = new String[valoresClave.size()];
		int i=0;
		for(Valor v : valoresClave) {
			arreglo[i++]=v.getColumna();
		}		
		return arreglo;
	}
	*/
	
	public void iterar(Command1<ValorObject> comando) throws Exception {
		for(ValorObject v: valores) {
			comando.execute(v);
		}
	}

	public boolean isExisteValor(String col) {
		return getValor(col)!=null;
	}
}
